package cn.tedu.basic;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

//测试 使用反射
public class Test3_UseReflection {
    public static void main(String[] args) throws Exception, Exception, Exception {
        Class<?> c = Class.forName("cn.tedu.basic.Student");
        Class<Student> s = Student.class;
        Class<? extends Student> cl = new Student().getClass();//获取对象
        Method(s); //反射方法
    }
    public static void Method(Class s) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Method[] methods = s.getMethods(); //获取所有的方法
        for(Method me : methods){
            System.out.println(me.getName());//获取方法名
            Class[] cla = me.getParameterTypes();//获取参数类型--放进数组里
            System.out.println(Arrays.toString(cla));
        }
        Field[] f = s.getFields();//获取成员变量
        for (Field fi : f){
            String name = fi.getName();//获取成员变量名称--公共的
            System.out.println(name);
            System.out.println(Arrays.toString(f));
            System.out.println(fi);
            String name1 = fi.getType().getName();//获取变量类型
            System.out.println(name1);
        }
        Constructor[] con = s.getConstructors(); //获取构造方法
        for (Constructor cons : con){
            System.out.println(cons.getName());//获取构造方法名
            Class[] pt = cons.getParameterTypes();//获取构造方法参数类型
            System.out.println(Arrays.toString(pt));
        }
        Object o = s.newInstance();//新建对象--触发无参构造方法
        System.out.println(o);//打印的是地址值
        Constructor co = s.getConstructor();
        System.out.println(co.getName());
        Constructor co1 = s.getConstructor(int.class,String.class);
        Object yulian = co1.newInstance(19, "ruanfeifei");
        System.out.println(yulian);
        //
        Constructor co2 =s.getConstructor(int.class);
        Object o1 = co2.newInstance(20);
        System.out.println(o1);
        //成员变量利用反射set/get
        Field f1 = s.getField("name");//变量名--字符串类型
        System.out.println(f1.getName());
        Object o2 = s.newInstance();
        f1.set(o2,"yumin");//创建对象并赋值
        Object o3 = f1.get(o2);
        System.out.println(o3);
        //
        Field f2 = s.getField("age");
        Object o4 = s.newInstance();
        f2.set(o4,22);
        Object o5 = f2.get(o4);
        System.out.println(o5);
        //获取一个方法
        Method m = s.getMethod("make", int.class);
        Method m3  = s.getDeclaredMethod("get");//利用暴力反射
        Method m4 = s.getMethod("wash", String.class);
        //利用反射执行方法
        Object o6 = s.newInstance();
        m4.invoke(o6,"yumin");//对象和要传入的参数
        m.invoke(o6,10000);
        m3.setAccessible(true);//默认是没有权限的
        m3.invoke(o6);
        //暴力反射--私有的方法-private
        Method[] de = s.getDeclaredMethods();
        for (Method mt : de){
            String st  = mt.getName();
            Class<?>[] pt = mt.getParameterTypes();
            System.out.println(st);
            System.out.println(Arrays.toString(pt));
        }

    }
}
